Wann immer...
brauchen Sie ein selbstgestaltetes Dialogfeld.
EXCEL verwaltet diese Dialogfelder in "Dialogblättern" von Arbeitsmappen. Diese "Dialogblätter" stellen eine Zeichenfläche dar, auf der sie die Anordnung der Dialogelemente entwerfen und die Verhaltensweisen der einzelnen Elemente festlegen.
Abbildung 36: eine leere Zeichnungsfläche und die Symbolleiste für selbstgestaltete Dialoge
Dialogblatt anfordern Verwenden Sie dazu den Befehl EINFÜGEN, MAKRO, DIALOG.
Diese Symbolleiste wird automatisch eingeblendet, sobald sie ein Dialogblatt anlegen oder zu ihm wechseln. Sie enthält folgende Elemente:
Textfeld ("Textbox") Gruppenfeld ("Groupbox") Kontrollkästchen ("Checkbox") Listenfeld ("Listbox") Kombination Text-Listenfeld ("Listbox" und "Editbox") Laufleiste ("Scrollbar") Eigenschaften Zeichenraster |
Bearbeitungsfeld ("Editbox") Schaltfläche ("Button") Optionsfeld ("Optionbutton") Dropdown-Listenfeld ("Dropdown") Dropdown Kombination Textfeld-Listenfeld ("Dropdown" und "Editbox") Drehfeld ("Spinner") Code bearbeiten Dialog ausführen |
Abbildung 37: Elemente der Dialogleiste "Symbol" und ihre Bedeutung
Jedes Dialogfeld setzt sich aus folgenden Elementen zusammen:
Rahmen, Titel und Elemente können bereits vor dem Anzeigen des Dialogs angesprochen werden. Sie können mittels VBA-Code die Größe des Dialogfeldrahmens festlegen, in Bearbeitungsfelder Text hineinstellen, Optionsfelder und Kontrollkästchen an- und abschalten, Listenfeldern die Listenwerte zuweisen, usw.:
Dialogfelder mit mehr als ein paar Texteingabefeldern herzustellen, ist eine langwierige Arbeit; es ist dafür viel Code zu schreiben. Die einzelnen Phasen sind:
Dialogelement einfügen Dies ist eine Arbeit, die Sie nur mit der Maus durchführen können! (Der Vollständigkeit halber füge ich hinzu, auch mit VBA-Befehlen, aber warum so umständlich?) Gehen Sie dazu so vor:
Mehrere gleichartige Elemente in einem einfügen Setzen Sie den Cursor auf den Rand des ersten eingefügten Elementes. Drücken Sie dann die Strg-Taste. EXCEL stellt daraufhin eine Kopie des Elementes zur Verfügung (sie liegt direkt über dem Element, ist also zunächst nicht sichtbar; der Mauszeiger erhält aber zusätzlich ein kleines Kreuz). Ziehen Sie die Kopie dorthin, wo Sie sie haben wollen. Tip: Wenn Sie zusätzlich auch die Umschalt-Taste drücken, ist nur waagrechte oder senkrechte Bewegung möglich (je nachdem, wie Sie die Bewegung beginnen).
Dialogelement verschieben Klicken Sie dazu mit der linken Maustaste auf das Element. Sobald der Rahmen erscheint, setzen Sie den Mauszeiger auf diesen. Ziehen Sie dann mit gedrückter linker Maustaste das Element an die gewünschte Stelle.
Größe ändern Der Rahmen um ein Dialogelement enthält 8 Anfasser (kleine Rechtecke). Setzen Sie den Mauscursor auf einen Anfasser, drücken Sie die linke Maustaste und ziehen Sie die Maus dorthin, wo der Anfasser zu liegen kommen soll.
Dialogelement löschen Klicken Sie mit der rechten Maustaste auf das Element. Wählen Sie im Kontextmenü den Befehl "Objekt löschen".
Mehrere Dialogelemente zugleich bearbeiten Klicken Sie mit der Maus außerhalb des Dialogfeldes auf das Dialog-Arbeitsblatt, damit kein Element ausgewählt ist. Ziehen Sie dann mit gedrückter linker Maustaste eine Linie um die Elemente, die Sie zugleich bearbeiten wollen. Sobald Sie die Maustaste auslassen, erscheinen alle von der Linie umschlossenen Elemente markiert und können gemeinsam verschoben, vergrößert/verkleinert oder gelöscht werden.
Mehrere nicht nebeneinander liegende Elemente werden ausgewählt, indem das erste angeklickt und alle weiteren bei gedrückter Umschalt-Taste angeklickt werden.
Wenn Sie den Wert eines Dialogelementes auslesen oder festsetzen wollen, müssen Sie es mit seinem Namen angeben. EXCEL gibt automatisch einen Namen vor, wenn Sie das Element schaffen. Dieser Name besteht aus zwei Teilen:
Diese Namen sind natürlich nicht aussagekräftig. Was sagt Ihnen schon beim Schreiben von Code z.B. "Listenfeld 24"?
Daher sollten Sie diese vorgegebenen Namen sofort nach dem Einfügen des Elementes ersetzen. Klicken Sie dazu auf das Feld links in der Bearbeitungszeile (dort würde in unserem Beispiel "Listenfeld 24" stehen). EXCEL markiert dann den gesamten Namen. Schreiben Sie jetzt den neuen Namen und drücken Sie unbedingt die Eingabetaste. Nur dann wird der Name auch wirklich akzeptiert.
Namenskonventionen Vor allem bei größeren Programmen ist es wichtig, den Überblick zu bewahren. Daher bietet sich folgende Konvention an:
Der Name des Elementes würde in unserem Beispiel also lauten: "EDlg_EB_Famname"
In jedem Dialogfeld gibt es eine natürliche Abfolge der Eingaben-wahrscheinlich zeilenweise von oben nach unten. Zum nächsten Element gewechselt wird wie in den eingebauten EXCEL-Dialogen durch Drücken der Tabulator-Taste. Umschalt+Tabulator wechselt zum vorhergehenden Element.
EXCEL legt die Tabulator-Reihenfolge der Elemente selbst fest; es ist die Reihenfolge, in der Sie Elemente in das Dialogfeld stellen. Das entspricht wahrscheinlich nur selten dem, was Sie wünschen. Über das Menü "Extras" und den Befehl "Aktivierfolge" können Sie nachträglich die Reihenfolge verändern.
Alle Elemente eines Dialogfeldes behalten nach dessen Schliessung die eingegebenen Werte. Wird das Dialogfeld nochmals ausgerufen, zeigt es diese. Das wird meistens nicht passen. Daher müssen die Elemente-noch bevor das Dialogfeld angezeigt wird-mittels Code die gewünschten Werte erhalten.
ThisWorkbook.Dialogsheets("MeinDialog").Editboxes("DlgM_EB_Name"). _ Text="Müller"
ThisWorkbook.Dialogsheets("MeinDialog").Listboxes("DlgM_LB_Abteilungen"). _ List=ThisWorkbook.Sheets("Abteilungen").[A1].CurrentRegion
ThisWorkbook.Dialogsheets("MeinDialog").Listboxes("DlgM_LB_Abteilungen"). _ Listindex=1
ThisWorkbook.Dialogsheets("MeinDialog"). _ OptionButtons("DlgM_OB_Gruppe").Value=xlOn
Die Werte mehrerer Elemente zugleich festlegen Das geht ganz einfach! Hier kommt uns nämlich die Tatsache entgegen, daß jedes Element ein Mitglied einer Element-Auflistung ist. Daher können wir zum Beispiel:
ThisWorkbook.Dialogsheets("MeinDialog").Editboxes("DlgM_EB_Name"). _ Text=""
ThisWorkbook.Dialogsheets("MeinDialog").Checkboxes.Value=xlOff
ThisWorkbook.Dialogsheets("MeinDialog").Listboxes.Listindex=1
Auch während der Dialog angezeigt wird, können seine Elemente beeinflußt werden. Ansprache wie oben, allerdings genügt jetzt für die Angabe, um welchen Dialog es sich handelt, "ActiveDialog":
ActiveDialog.Editboxes("DlgM_EB_Name").Text="Müller"
Alle aktivierbaren Dialogelemente reagieren, wenn sie verändert werden. Damit läßt sich schon während der Eingabe in ein Dialogfeld ein wenig kontrollieren, ob die Eingabe sinnvoll ist. Wird ein Dialogelemente verändert, prüft EXCEL, ob es eine Prozedur gibt, die mit dem Element "verknüpft" wurde. Ist das der Fall, dann wird diese Prozedur ausgeführt. Im VBA-Handbuch werden diese Prozeduren "Ereignis-Prozeduren" genannt. Hier sind die "Ereignisse" für die wichtigsten Dialogelemente:
Element | Ereignis | EXCEL-Standard-Bezeichnung für Ereignis |
Bearbeitungsfeld (Editbox) | Eingeben oder Löschen eines Zeichens | BeiÄnderung |
Schaltknopf (Button) | Drücken des Schaltknopfes mit der Maus, Enter-Taste, wenn Knopf ausgewählt ist | BeiKlick |
Optionsschaltfläche (OptionButton) | Ein- oder Ausschalten des Knopfes mit Maus oder Tastatur | BeiKlick |
Listenfelder | Auswählen eines Listeneintrages mit Maus oder Tastatur | BeiÄnderung |
Kontrollkästchen | Ein- oder Ausschalten des Kästchens mit Maus oder Tastatur | BeiKlick |
Bildlaufleiste | Anklicken der Leiste | BeiÄnderung |
Drehfeld | Anklicken eines der Dreihfeld-Pfeile | BeiÄnderung |
Dialogfeldrahmen | Starten des Dialoges mittels VBA-Programm oder Drücken des Schaltknopfes "Dialog ausführen" in der Symbolleiste "Dialog" | BeiAnzeigen |
Ereignis-Prozedur durch EXCEL anlegen lassen Wenn ein Dialog-Element ausgewählt ist (also einen grauen Rahmen hat), können Sie EXCEL veranlassen, den Kopf und die Schlußzeile der für das Element zu schaffenden Ereignis-Prozedur selbsttätig anzulegen. Klicken Sie dazu in der Symbolleiste "Dialog" auf das Symbol "Code bearbeiten".
Wenn Sie das in einem bestimmten Dialogfeld das erste Mal machen, legt EXCEL in der Arbeitsmappe, in der sich das Dialogblatt befindet, ein neues VBA-Modul an. Weitere Prozedur-Köpfe stellt EXCEL dann in dieses Modul hinein.
Zugleich mit dem Anlegen des Prozedur-Kopfes legt EXCEL fest, daß diese Prozedur bei einem auslösenden Element-Ereignis abgearbeitet werden soll.
Ereignis-Prozedur selbst anlegen Sie können die Prozedur auch komplett selbst und in einem VBA-Modul Ihrer Wahl schreiben. Markieren Sie dann das Element. Rufen Sie im Menü "Extras" den Befehl "Zuweisen..." auf. Dort finden Sie in der Liste aller geladenen VBA-Prozeduren die von Ihnen geschriebene. Klicken Sie mit der Maus auf den Namen der Prozedur.
Element eine andere Ereignis-Prozedur zuweisen Markieren Sie zunächst das Element. Rufen Sie dann im Menü "Extras" den Befehl "Zuweisen..." auf. Dort finden Sie eine Liste aller geladenen VBA-Prozeduren. Klicken Sie mit der Maus auf den Namen der Prozedur, die bei einem "Ereignis" des Elements ausgeführt werden soll.
Verbindung zwischen Element und Ereignis-Prozedur trennen Markieren Sie zunächst das Element. Rufen Sie dann im Menü "Extras" den Befehl "Zuweisen..." auf. Löschen Sie den Text im Eingabefeld "Makroname/Prozedur".
Zur Ereignis-Prozedur springen Markieren Sie das Element. Drücken Sie dann in der Symbolleiste "Dialog" auf das Symbol "Code bearbeiten".
Eingabefeld darf nur Zahl enthalten Wir können zwar anordnen, daß ein Eingabefeld nur eine Zahl enthalten darf (über das Menü "Format" und den Befehl "Objekt..."), aber diese Prüfung wird erst durchgeführt, wenn wir das Dialogfeld schliessen. Wollen wir schon während der Eingabe prüfen, verwenden wir die VBA-Funktion "IsNumeric". Sie ergibt "Wahr", wenn der Text im Eingabefeld nur Ziffern, ein Komma und Tausenderpunkte enthält. Die Ereignis-Prozedur "PruefeObZahl" stellt nach jedem Tastendruck fest, ob das eingebene Zeichen "numeric" ist. Wenn nicht, erfolgt eine Warnung und das letzte, offensichtlich falsche Zeichen wird aus dem Eingabefeld-Text entfernt.
Den Code dieses Beispiels finden Sie in der Datei "ZAHL.XLS". |
Sub PruefeObZahl() Dim sZuPruefendesEingabefeld As EditBox Set sZuPruefendesEingabefeld = _ ActiveDialog. Editboxes(Application.Caller) If Not IsNumeric(sZuPruefendesEingabefeld.Text) Then Beep MsgBox "Dies ist keine Zahl !", vbCritical, "Fehler:" sZuPruefendesEingabefeld.Text = Left(sZuPruefendesEingabefeld.Text, _ Len(sZuPruefendesEingabefeld.Text) - 1) SendKeys "{end}" End If End Sub
Hinweis "Isnumeric" ist ein bißchen dumm. Man kann ihm an beliebiger Stelle Tausender-Punkte unterschieben, mehr als ein Dezimalkomma läßt es nicht zu.
Was zeigt dieses Beispiel noch? Zunächst einmal ist diese Prozedur universell verwendbar. Sie stellt nämlich nicht auf ein konkretes Eingabefeld ab, sondern sie erfragt dessen Namen, während sie läuft:
Dim sZuPruefendesEingabefeld As EditBox Set sZuPruefendesEingabefeld = _ ActiveDialog.Editboxes(Application.Caller)
Die Eigenschaft "Caller" des "Application"-Objektes gibt den Namen des Dialog-Elementes zurück, durch dessen Veränderung die Prozedur "PruefeObZahl" aufgerufen wurde.
Da EXCEL darauf besteht, nach der Eingabe eines Textes in ein Eingabefeld durch VBA-Code den Text komplett zu markieren, sodaß jeder Tastendruck ihn ganz verschwinden lassen würde, ordnen wir in der drittletzten Zeile an:
SendKeys "{end}"
Das entspricht dem Drücken der "Ende"-Taste. Die Markierung wird aufgehoben, der Cursor wird an das Ende der verbliebenen Zeichen gesetzt.
Abhängige Felder automatisch ausfüllen Angenommen, der Benützer eines VBA-Programmes kann in einem Dialogfeld aus einer Mitarbeiterliste auswählen. In einer Tabelle sind zu jedem Mitarbeiter auch Abteilung, Zimmernummer und Telefonklappe aufgeführt. Daher liegt es nahe, nach Auswahl des Mitarbeiters die anderen Eingabefelder automatisch ausfüllen zu lassen.
Abbildung 38: Wird aus dem Listenfeld "Name" ein Name
ausgewählt, stellt eine "Ereignis-Prozedur" die zum Mitarbeiter gehörenden Daten
für Abteilung, Zimmer und Telefonklappe in die Eingabefelder.
Hier ist der Code:
'Objekt-Variable für Dialog1 deklarieren Private Dialog1_DD_Name As DropDown Private Dialog1_EB_Abteilung As EditBox Private Dialog1_EB_Telefonklappe As EditBox Private Dialog1_EB_Zimmer As EditBox Private rMitarbeiterDaten As Range 'Objekt-Variablen die Dialogelemente zuweisen Sub SetzeObjektVariableFürDialog1() With DialogSheets("Dialog1").DrawingObjects Set Dialog1_DD_Name = .Item("Dialog1_DD_Name") Set Dialog1_EB_Abteilung = .Item("Dialog1_EB_Abteilung") Set Dialog1_EB_Telefonklappe = .Item("Dialog1_EB_Telefonklappe") Set Dialog1_EB_Zimmer = .Item("Dialog1_EB_Zimmer") End With End Sub 'Dialogfeld-Elemente auf Anzeige vorbereiten Sub Dialog1_BeiAnzeigen() Call SetzeObjektVariableFürDialog1 Dialog1_DD_Name.OnAction = "Dialog1_DD_Name_EreignisProzedur" 'Tabellenbereich mit Mitarbeiter-Daten Objekt-Variabler zuweisen Set rMitarbeiterDaten = _ ThisWorkbook.Sheets("Tabelle1").Cells(1, 1).CurrentRegion Set rMitarbeiterDaten = _ rMitarbeiterDaten.Offset(1).Resize(rMitarbeiterDaten.Rows.Count - 1) Dialog1_DD_Name.List = rMitarbeiterDaten.Columns(1) Dialog1_DD_Name.ListIndex = 1 Call Dialog1_DD_Name_EreignisProzedur End Sub 'Abhängige Bearbeitungsfelder nach Auswahl eines Namens 'füllen Sub Dialog1_DD_Name_EreignisProzedur() Dialog1_EB_Abteilung.Text = _ rMitarbeiterDaten.Cells(Dialog1_DD_Name.ListIndex, 2).Value Dialog1_EB_Zimmer.Text = _ rMitarbeiterDaten.Cells(Dialog1_DD_Name.ListIndex, 3).Value Dialog1_EB_Telefonklappe.Text = _ rMitarbeiterDaten.Cells(Dialog1_DD_Name.ListIndex, 4).Value End Sub
Erklärung Wie haben wir den Abteilungs-Namen gefunden? Wir fragen zunächst die "Listindex"-Eigenschaft des Listenfeldes ab. Sie gibt uns eine Zahl zurück, die laufende Nummer des ausgewählten Eintrages im Listenfeld. Angenommen, wir haben "Mück" gewählt, dann ist das eine Zwei, denn Mück ist der zweite Eintrag. Genauso ist "Mück" aber der zweite Eintrag im Tabellenbereich "rMitarbeiterDaten", aus dem wir die Liste gefüllt haben. Daher finden wir den Abteilungsnamen in jener Zelle von "rMitarbeiterDaten", die in der zweiten Zeile und in der zweiten Spalte steht. Obwohl "rMitarbeiterDaten" nur eine Spalte breit ist, können wir mit der "Cells"-Methode über diese Grenze hinausgreifen. In Spalte Drei finden wir dann die Zimmer-Nummer, in Spalte Vier die Telefonklappe. Wichtig: Spalte Eins ist nicht notwendig Spalte A. Es ist, wie die folgende Abbildung zeigt, die erste Spalte von "rMitarbeiterDaten"!
Abbildung 39: Der Tabellenbereich "rMitarbeiterDaten" ist
zwar nur eine Spalte breit, aber wir können dennoch feststellen, welchen Wert
eine Zelle in (vom Bereich weg gesehen) Spalte 2, Spalte 3 usw hat. Die
"Cells"-Methode macht es möglich.
Beispiele zu diesem Kapitel finden Sie in der Datei "ABHAENGIG.XLS". |
Der Dialogfeldrahmen stellt den Hintergrund für benutzerdefinierte Dialogfelder dar. Er weist keine Formatierungseigenschaften auf, sondern lediglich eine Position, eine Größe und einen Titel. Pro Dialogblatt gibt es nur einen Dialogfeldrahmen, der weder gelöscht, noch vor ein anderes Grafikobjekt geschoben werden kann. In Tabellenblättern gibt es keine Dialogfeldrahmen.
Eigenschaft | Werte | bewirkt |
Text | beliebige Zeichen | Setzt/ändert Titel des Dialogfeldes |
Left, Top, Height, Width | Zahl | Setzt/ändert Position und Größe des Dialogfeldes. Kann auch verändert werden, während der Dialog angezeigt wird |
Alle Dialogelemente auf einem Dialogblatt sind Teil der "DrawingObjects"-Auflistung. Dieses Container-Objekt ist wichtig, wenn es gilt, alle Elemente eines Dialoges zu untersuchen. Die Datei "DlgVars.XLS" wäre ohne dieses Objekt kaum denkbar: Sie schreibt automatisch den Code für ein komplettes Dialogfeld in ein Modulblatt. Dabei untersucht sie Element für Element in dessen Eigenschaft als Mitglied der "DrawingObjects".
Das Beispiel-Programm dazu: "DlgVars.XLS" |
Eigenschaft | Werte | bewirkt |
Visible | True, False | Element ist sichtbar/nicht sichtbar |
Enabled | True, False | Element kann mit Tastatur oder Maus geändert werden/nicht geändert werden |
Top, Left | Zahl | Position im Dialograhmen Wichtig: Kann nur gesetzt werden, wenn der Dialog nicht angezeigt wird |
Statischer Text zur Erklärung der Dialogelemente für Ein- und Ausgabe. Der Inhalt des Feldes kann über die Eigenschaft "Text" sowohl vor dem Anzeigen des Dialogs als auch zur Laufzeit des Dialogs verändert werden:
ActiveDialog.[textfeldname].Text="Soeben verändert"
Nimmt Text durch Tastatureingabe auf oder zeigt Text an, der über ein VBA-Programm in das Feld gestellt wurde. Der Inhalt des Feldes kann über die Eigenschaft "Value" zur Laufzeit des Dialogs verändert werden:
ActiveDialog.[bearbeitungsfeldname].Value="Soeben verändert"
Gleichermaßen kann der Inhalt ausgelesen werden:
Variable= ActiveDialog.[bearbeitungsfeldname].Value
Der Text im Bearbeitungsfeld wird durch Zuweisung einer leeren Zeichenkette gelöscht:
ActiveDialog.[bearbeitungsfeldname].Value =""
Das Bearbeitungsfeld kann auch nur zur Anzeige eines Textes verwendet werden. Dies wird über die "Wählbar"-Eigenschaft gesteuert:
ActiveDialog.[bearbeitungsfeldname].Enabled=False
Schließlich kann ein Bearbeitungsfeld auch unsichtbar gemacht werden.
ActiveDialog.[bearbeitungsfeldname].Visible=False
Kontrollmöglichkeiten während des Programm-Laufs Während Text in einer Editbox eingegeben oder bearbeitet wird, verzweigt VBA nach jedem Tastendruck in die zugehörige Ereignis-Prozedur. So läßt sich zum Beispiel prüfen, ob der eingegebene Text eine Zahl ergibt (siehe oben die Prozedur "PruefeObZahl").
Rahmen zur optischen Gestaltung eines größeren Dialogfeldes und zur Steuerung einander gegenseitig ausschließender Optionen. Für alle mit ihrer linken oberen Ecke im Groupbox-Rahmen stehenden Optionsfelder gilt, daß nur eines von ihnen ausgewählt sein kann. Die (von oben nach unten) fortlaufende Nummer der im Gruppenfeld ausgewählten Option können Sie in einer Tabellenzelle ablegen und erfragen. Es gibt aber in EXCEL 7.0 keine Möglichkeit, mit einem VBA-Befehl die Nummer zu erfragen. Stattdessen muß jedes Optionsfeld einzeln geprüft werden.
Löst Vorgänge aus. Die Schaltflächen "OK" und "Abbrechen"sind standardmäßig vorgegeben, weitere Schaltflächen werden beim Zeichnen des Dialogfeldes dazugefügt. Jeder Schaltfläche kann (über das Menü "Format" und den Befehl "Objekt...") eine oder mehrere der vier Funktionsweisen "Standard", "Abbrechen", "Schließen" und "Hilfe" zugeordnet werden:
Standard | ist ausgewählt (stark umrandet); wird die Enter-Taste gedrückt, verhält sich der Dialog so, als wäre die Standard-Schaltfläche angeklickt worden |
Abbrechen | Dialog gilt als "Abgebrochen", gibt an den aufrufenden Code den Wert "False" zurück |
Schließen | Dialog wird beendet, Dialogfeld wird geschlossen. Gibt an den aufrufenden Code "True" zurück |
Hilfe | Schaltfläche erhält den Text "Hilfe" |
Diese Funktionsweisen können Schaltflächen auch durch VBA-Code zugewiesen werden oder durch Code erfragt werden:
Button-Objekt.DefaultButton ("True" oder
"False")
Button-Objekt.CancelButton ("True" oder "False")
Button-Obkekt.DismissButton ("True" oder "False")
Button-Objekt.HelpButton ("True" oder "False")
Diese Eigenschaften eines Buttons können nebeneinander festgelegt werden. Einem Standard-Button kann zum Beispiel die (immer vorgegebene) Eigenschaft, bei Anklicken das Dialogfeld zu schließen, entzogen werden:
ActiveDialog.Buttons("Dlg_BT_OK").DissmissButton=False
Button-Aufschrift ändern Die Beschriftung jedes Buttons ist durch seine "Caption"-Eigenschaft festgelegt. Diese kann erfragt und geändert werden, bevor oder während der Dialog angezeigt wird:
If ActiveDialog.Buttons("Dlg_BT_OK").Caption = "Guten Abend" Then ActiveDialog.Buttons("Dlg_BT_OK").Caption = "Guten Morgen" End If
Hinweis Egal, wie hoch Sie einen Schaltknopf machen, Text stellt er immer nur in einer Zeile dar.
Kennt drei Werte: Angekreuzt, nicht angekreuzt, teilweise angekreuzt. Der Zustand kann mit Hilfe der "Value"-Eigenschaft und dreier Konstanten erfragt oder gesetzt werden:
If ActiveDialog.[kontrollkästchen].Value= xlOn Then ActiveDialog.[kontrollkästchen].Value = xlOff ElseIf ActiveDialog.[kontrollkästchen].Value = xlOff Then ActiveDialog.[kontrollkästchen].Value = xlMixed End If
Kann ausgewählt oder nicht ausgewählt sein. Liegen mehrere Optionsfelder mit ihrer linken oberen Ecke in einem Gruppenfeld-Rahmen, sorgt EXCEL dafür, daß jeweils nur eines von ihnen ausgewählt werden kann.
If ActiveDialog.[Optionsfeld].Value= xlOn Then ActiveDialog.[ Optionsfeld].Value = xlOff ElseIf ActiveDialog.[ Optionsfeld].Value = xlOff ... End If
Bildet die Einträge in einem zusammenhängenden Bereich einer Tabelle ab. Es können, je nach Einstellung des Listenfeldes über FORMAT, OBJEKT
ausgewählt werden. Der Tabellenbereich, der die Liste enthält, kann in diesem Dialog im Bearbeitungsfeld "Listenbereich" angegeben werden.
Ein "einfaches" Listenfeld gibt die Zahl des Elementes in der Liste zurück, welches ausgewählt worden ist. Die Zahl wird in jener Zelle, deren Bezug im Dialog FORMAT, OBJEKT ins Feld "Ausgabeverknüpfung" eingetragen worden ist, hinterlegt. Sie kann auch durch Abfragen der Eigenschaft "Listindex" erfragt werden. Die beiden eine Mehrfachauswahl zulassenden Listenfeldtypen liefern Datenfelder, die die Position der ausgewählten Listeneinträge enthalten. Leider führt die in der Online-Hilfe für EXCEL 5.0 angegebene Syntax für die Mehrfachauswahl zu einem Laufzeitfehler, sodaß dafür keine Beispiele gegeben werden können. In EXCEL für Windows95 ist Mehrfach-Auswahl wie in der Online-Hilfe beschrieben möglich.
Listenfelder werden über folgende Eigenschaften gesteuert:
Eigenschaft | verlangt | bewirkt |
List | Datenfeld, Bereichsobjekt | Liste wird mit den Elementen des Datenfeldes gefüllt |
List(Zahl) | Zahl zw. 1 und Anzahl der Elemente im Listenfeld | Beim Setzen: legt den Wert des Listenfeld-Eintrages "Zahl"
fest
Beim Lesen: Gibt den Wert des Listenelementes an der Stelle von "Zahl" aus |
ListIndex(Zahl) | Zahl | Beim Setzen: Legt das aktive Element der Liste fest
Beim Lesen: gibt Position des aktiven Elementes in der Liste zurück |
ListCount | Gibt Anzahl der Elemente im Listenfeld zurück | |
ListFillRange | Verweis auf einen Tabellenbereich in Textform | Beim Setzen: Liste wird mit dem Wert der Zellen des
Tabellenbereiches gefüllt Beim Lesen: gibt den Tabellenbereich als Text zurück, aus dem die Liste gefüllt wurde |
Listenfelder werden über folgende Methoden verändert:
Methode | bewirkt |
AddItem | Liste erhält ein zusätzliches Element |
RemoveItem | Löscht ein Element aus der Liste |
RemoveAllItems | Löscht die ganze Liste |
"List" füllt die Liste aus den Einträgen eines Datenfeldes, "ListFillRange" aus den Zellen eines Tabellenbereiches. Verwenden Sie dennoch auch für Tabellen-Listen "List", den "ListFillRange" gibt sowohl beim Löschen als auch beim Hinzufügen von Listeneinträgen den Geist auf. Und EXCEL ist gescheit genug, die Zellen eines Tabellenbereiches automatisch in ein Datenfeld umzuwandeln, sobald "List" mit Hilfe einer Objekt-Variablen der Tabellenbereich gezeigt wird.
Weist einer Liste die Elemente eines Datenfeldes oder eines als Objekt-Referenz vorliegenden Zellbereiches zu.
Syntax 1 - ganze Liste
Objekt.List
Beispiel
Set rDieListe = ThisWorkbook.Sheets("Tabelle1"). _ Cells(1, 1).CurrentRegion Dlg1_Listbox_1.List = rDieListe
Listenbereich der Tabelle wird mit einem EXCEL-Namen angesprochen Angenommen, Sie haben in einer Tabelle einen Bereich von Zellen mit einem Namen versehen (in unserem Fall "TabellenZellenFuerListe"), dann können Sie mit Hilfe der Methode "Evaluate" diese Zelladresse in eine Objekt-Referenz umwandeln und die Referenz dann der "List"-Eigenschaft zuweisen:
ThisWorkbook.DialogSheets("Dialog1"). _ ListBoxes("Dialog1_LB_DieListe").List = Evaluate("TabellenZellenFuerListe")
Sheets("Dialog1").ListBoxes("Dialog1_LB_DieListe").List = _ Evaluate("[ListeNeu.xls]Tabelle1!C1:C12")
Wert eines Listen-Elementes erfragen Dazu weisen wir das Ergebnis von "List(Index)" einer Variablen zu oder verwenden es in einer Anweisung:
' Wert von Listen-Element 6 erfragen vListenwert=Dlg1_DasListenfeld.List(6) ' Wert des aktiven, gerade ausgewählten Listen-Elementes erfragen vListenwert=Dlg1_DasListenfeld.List(Dlg1_DasListenfeld.ListIndex) ' Inhalt von Element 6 prüfen If Dlg1_DasListenfeld.List(6)= "Guten Morgen" Then ...
Wert eines Listen-Elementes setzen Dazu weisen wir dem Listen-Element den Wert zu:
sAntwort = InputBox("Bitte geben Sie den neuen Text " & _ "des Listeneintrags an:") If sAntwort = "" Then Exit Sub Dialog1_LB_DieListe.List(Dialog1_LB_DieListe.ListIndex) = sAntwort
Syntax
Objekt.ListIndex
Gibt die fortlaufende Nummer des aktiven Listen-Elementes wieder. Diese Eigenschaft legt fest oder informiert darüber, welches Element der Liste "aktiv" ist, also ausgewählt erscheint oder ausgewählt wurde. "ListIndex" ist immer eine Zahl.
Beispiele
Element 4 der Liste auswählen (erscheint mit Balken unterlegt):
[Listenfeld-Referenz].ListIndex=4
Fortlaufende Nummer des Elements innerhalb der Liste anzeigen, das ausgewählt wurde:
MsgBox [Listenfeld-Referenz].ListIndex
Inhalt des ausgewählten Listenelementes erfragen
Wenn der Listenbereich als Text vorliegt und "Listenindex" den Wert 2 hat.
MsgBox Application.Index([[MAPPE1]Tabelle1!A1:A5], 2)
Beachten Sie die beiden eckigen Klammerpaare!
Gibt als Zahl die Anzahl der Listen-Elemente wieder. Nützlich, wenn es darum geht, alle Elemente einer Liste in eine Tabelle zu schreiben:
For iZaehler = 1 To Dialog1_LB_DieListe.ListCount rListenBereich.Cells(iZaehler, 1).Value = Dialog1_LB_DieListe.List(iZaehler) Next
Die Adresse des Tabellenbereiches, der die Einträge der Liste enthält, in Text-Form. Achtung: die Adresse muß in Textform angegeben werden; mit Objektvariablen, die eine Referenz auf den Tabellenbereich enthalten, kann "Listenbereich" nicht gefüttert werden!
Beispiel:
[Listenfeld-Referenz].ListFillRange="[MAPPE5.XLS]Tabelle3!A2:A14"
nicht aber:
Set Namenszellen=Workbooks("Mappe5.xls")._ Sheets("Tabelle3").Range("A2:A14") [Listenfeld-Referenz]. ListFillRange =Namenszellen
So geht es aber mit einer Objektvariablen:
[Listenfeld-Referenz]. ListFillRange=Namenszellen.Address (external:=True)
Die Address-Methode macht aus einer Objekt-Referenz wieder einen Referenz-Text. Das benannte Argument "external" stellt den vollständigen Text der Referenz bereit: Mappe, Blatt und Zellen.
Idente Funktionalität mit dem Listenfeld, jedoch muß die Liste durch Klicken auf die Schaltfläche am rechten Rand oder durch Drücken der Tasten "Alt"+"Pfeil-ab" erst aufgeklappt werden.
Besteht aus einem Bearbeitungsfeld und einem Listenfeld. Die beiden sind unabhängige Dialogfeld-Elemente, allerdings mit folgender Funktionalität verbunden:
Hinweis Ein Eintrag in das Bearbeitungsfeld wird nicht im Listenfeld gesucht. Selbst wenn er dort vorhanden ist, enthält die Ausgabeverknüpfungs-Zelle den Wert 0. Sie müssen also mit VBA-Code die ganze Liste durchsuchen. Wird der Text des Bearbeitungsfeldes nicht gefunden, müssen Sie ihn mit VBA-Code in die Liste einfügen.
Code für die praktische Arbeit mit einem Kombinationsfeld Liste-Text finden Sie in den Dateien "KombiListe.XLS" und "KombiFeld.XLS". |
Abbildung 40: "KombiListe.XLS" enthält Beispielscode für
die Arbeit mit einem Kombinationsfeld Liste-Text. Nach jedem Eintrag kann durch
Drücken auf den oberen Schaltknopf ("Prüfen...") festgestellt werden, ob der
Eintrag schon in der Liste enthalten ist. Wenn ja, erfolgt eine Warnung. Der
Schaltknopf "Eintrag in Liste sortiert aufnehmen" vergrößert den
Tabellenbereich, aus dem das Listenfeld gespeist wird, um eine Zeile, schreibt
in diese Zeile den neuen Eintrag, sortiert den Tabellenbereich und weist ihn als
Datenquelle wieder dem Listenfeld zu.
Mit Kombinationsfeld Liste-Text idente Funktionalität, doch muß die Liste durch Klicken auf die Schaltfläche am rechten Rand oder durch Drücken der Tasten "Alt"+"Pfeil-ab" erst aufgeklappt werden.
Funktionalität wie in der in EXCEL eingebauten Datenmaske. Die Bildlaufleiste verwaltet eine ganze Zahl zwischen den beiden (einstellbaren) Eckwerten "Min" und "Max". Diese Zahl kann über die Eigenschaft "Value" ausgelesen und auch eingestellt werden. Jedes Klicken auf die Pfeile am oberen bzw. unteren Ende der Bildlaufleiste erhöht bzw. vermindert den aktuellen Wert der Bildlaufleiste. Der kleinste Wert ("Min"-Eigenschaft) ist 0, der größte ("Max"-Eigenschaft) ist 30000. Zusätzlich kann ein Wert für "LargeChange" eingestellt werden. Diese "Große Bewegung" wird ausgelöst, wenn Sie mit der Maus nicht auf den "Fahrstuhl" klicken, sondern auf die Flächen darüber und darunter.
In der Funktionalität mit der Bildlaufleiste ident bis auf das Fehlen von "LargeChange". Drehfelder werden wahrscheinlich immer im Zusammenhang mit Bearbeitungsfeldern eingesetzt. Der Gleichklang zwischen Drehfeld und Bearbeitungsfeld ist eine verzwickte Aufgabe:
Beispiele für das Arbeiten mit Drehfeldern finden Sie in der Datei "Drehfeld.XLS". Der Modul "Mod DialogDrehfeld" enthält den Code für das Prüfen einer numerischen Eingabe, die zwischen den Grenzen eines Drehfeldes liegen muß. "Mod HalbstundenDrehfeld" zeigt in seinem Bearbeitungsfeld die Uhrzeit; diese kann mit dem Drehfeld halbstundenweise verändert werden. |
Copyright © by JOANNEUM RESEARCH Forschungsgesellschaft mbH |